package utilities;

/**
 * Created with IntelliJ IDEA.
 * User: Jordi
 * Date: 3/01/13
 * Time: 18:04
 * To change this template use File | Settings | File Templates.
 */
public class ContingutObjecte implements Cloneable, java.io.Serializable, Comparable {

    protected Object contingut;
    protected String valorEtiqueta;
    protected boolean compararPerContingut = false;
    protected boolean errorCompararConNull;
    public ContingutObjecte() {}
    public ContingutObjecte(Object contingut, String valorEtiqueta) {
        this.contingut = contingut;
        this.valorEtiqueta = valorEtiqueta;
    }
    public ContingutObjecte(Object contingut, String valorEtiqueta, boolean compararContingut) {
        this.contingut = contingut;
        this.valorEtiqueta = valorEtiqueta;
        this.compararPerContingut = compararContingut;
    }
    public Object getContingut() {
        return  this.contingut;
    }
    public void setContingut(Object contingut) {
        this.contingut = contingut;
    }
    public String getValorEtiqueta() {
        if (valorEtiqueta == null){
            if (contingut != null){
                valorEtiqueta = contingut.toString();
            }else{
                valorEtiqueta = "";
            }
        }
        return valorEtiqueta;
    }
    public void setValorEtiqueta(String valorEtiqueta) {
        this.valorEtiqueta = valorEtiqueta;
    }
    public boolean isCompararPorValor() {
        return compararPerContingut;
    }
    public void setCompararPorValor(boolean compararContingut) {
        this.compararPerContingut = compararContingut;
    }
    @Override
    public String toString(){
        return getValorEtiqueta();
    }
    @Override
    public int compareTo(Object objeto) {
        if (objeto == null) {
            if (errorCompararConNull){
                throw new NullPointerException("ContingutObjecte es null");
            }else{
                return -1;
            }
        }
        if (this.equals(objeto)){
            return 0;
        }
        ContingutObjecte vo = (ContingutObjecte) objeto;
        int i1 = this.valorEtiqueta.compareTo(vo.valorEtiqueta);
        int i2 = ((Comparable) this.contingut).compareTo((Comparable) vo.contingut);
        if (i1 > 0 && i2 > 0){
            return 1;
        }else if (i1 < 0 && i2 < 0){
            return -1;
        }else{
            if (compararPerContingut){
                return i2;
            }else{
                return i1;
            }
        }
    }
    @Override
    public boolean equals(Object objeto) {
        if (!(objeto instanceof ContingutObjecte)) {
            return false;
        }
        ContingutObjecte vo = (ContingutObjecte) objeto;
        return ((contingut == null?vo.contingut == null:contingut.equals(vo.contingut)) && (valorEtiqueta == null?vo.valorEtiqueta ==
                null:valorEtiqueta.equals(vo.valorEtiqueta)));
    }
    @Override
    public int hashCode() {
        return ((contingut == null?-1:contingut.hashCode()) ^ (valorEtiqueta == null?-1:valorEtiqueta.hashCode()));
    }
    public boolean isErrorCompararConNull() {
        return errorCompararConNull;
    }
    public void setErrorCompararConNull(boolean errorCompararConNull) {
        this.errorCompararConNull = errorCompararConNull;
    }
}
